package com.taotao.sso.service.impl;


import java.util.List;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.util.JsonUtils;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.jedis.JedisClient;
import com.taotao.sso.service.UserLoginService;

@Service
public class UserLoginServiceImpl implements UserLoginService {
	
	@Autowired
	private TbUserMapper usermapper;
	
	@Autowired
	private JedisClient client;
	
	@Value("${USER_INFO}")
	private String USER_INFO;
	
	@Value("${USER_EXPIRE_TIME}")
	private Integer USER_EXPIRE_TIME;

	@Override
	public TaotaoResult login(String username, String password) {
		// 1.注入服务
		// 2.校验用户名和密码是否为空
		if(StringUtils.isEmpty(username) && StringUtils.isEmpty(password)) {
			TaotaoResult.build(400, "用户名或者密码为空");
		}
		// 3.先校验用户名
		TbUserExample tbUserExample = new TbUserExample();
		Criteria criteria = tbUserExample.createCriteria();
		criteria.andUsernameEqualTo(username);
		List<TbUser> users = usermapper.selectByExample(tbUserExample);// select * from tb_user where username = ?;
		System.out.println(users.size());
		if(users.size()==0 || users == null) {
			 
			 return TaotaoResult.build(400, "用户不存在");
		 }
		// 4.在校验密码
		 TbUser user = users.get(0);
		 // 先加密密码在比较密码
		 String md5password = DigestUtils.md5DigestAsHex(password.getBytes());
		 if(!md5password.equals(user.getPassword())) {
			 return TaotaoResult.build(400, "密码错误");
		 }
		// 5.校验成功
		// 6.生成token:uuid 生成，还需设置token的有效期来模拟session ，用户的数据存放在redis中，（key:token,value:用户的数据json）
		String token = UUID.randomUUID().toString();
		//存放数据到redis中，使用jedis
		//设置密码为空
		user.setPassword(null);
		client.set(USER_INFO + ":" + token, JsonUtils.objectToJson(user));
		client.expire(USER_INFO + ":" + token, USER_EXPIRE_TIME);
		// 7.把token设置到cookie中， 在表现层设置
		
		return TaotaoResult.ok(token);
	}

	@Override
	public TaotaoResult getUserBytoken(String token) {
		//1.注入jedisClient
		//2.调用根据token查询 用户信息的方法 get方法
		String jsonUser = client.get(USER_INFO + ":" + token);
		//3.判断是否查询得到
		if(StringUtils.isNotBlank(jsonUser)) {
			//5.如果查询到，返回200，包含用户信息的对象转换为对象
			TbUser user = JsonUtils.jsonToPojo(jsonUser, TbUser.class);
			//重新设置过期时间
			client.expire(USER_INFO + ":" + token, USER_EXPIRE_TIME);
			return TaotaoResult.ok(user);
		}
		//4.查询不到返回400
		
		return TaotaoResult.build(400, "用户已过期");
	}

	@Override
	public TaotaoResult logoutAndDeleteToken(String token) {
		//1.注入jedisClient
		//2.调用根据token查询 删除用户信息的方法 del方法
		client.del(USER_INFO + ":" + token);
		
		return TaotaoResult.build(200, "用户已退出");
	
	}

}
